package com.itheima.controller;

import com.itheima.pojo.*;  // 导入相关的POJO类
import com.itheima.service.DeptService;  // 导入部门服务
import com.itheima.service.EmpService;  // 导入员工服务
import com.itheima.service.PerformanceService;  // 导入绩效服务
import com.itheima.service.SalaryService;  // 导入薪资服务
import com.alibaba.fastjson.JSONObject;  // 导入fastjson库，用于处理JSON
import org.springframework.beans.factory.annotation.Autowired;  // 导入自动注入的注解
import org.springframework.web.bind.annotation.GetMapping;  // 导入处理GET请求的注解
import org.springframework.web.bind.annotation.RequestMapping;  // 导入请求映射注解
import org.springframework.web.bind.annotation.RestController;  // 导入RestController注解，用于返回JSON响应

import java.util.List;  // 导入List类，用于存储数据
import java.util.Map;  // 导入Map类，用于存储键值对
import java.util.stream.Collectors;  // 导入Collectors工具类，用于流操作

@RestController  // 声明该类为控制器，处理HTTP请求
@RequestMapping("/sys")  // 设置控制器的基本请求路径
public class DashboardController {

    @Autowired  // 自动注入EmpService
    private EmpService empService;

    @Autowired  // 自动注入DeptService
    private DeptService departmentService;

    @Autowired  // 自动注入PerformanceService
    private PerformanceService performanceService;

    @Autowired  // 自动注入SalaryService
    private SalaryService salaryService;

    // 获取仪表盘数据的方法
    @GetMapping("/dashboard")
    public Result getDashboardData() {

        // 1. 获取总员工数
        long totalEmployees = empService.count();
        // 2. 获取平均工资
        Double averageSalary = salaryService.list().stream()
                .mapToDouble(Salary::getActualSalary)  // 获取每个薪资记录的实际薪资
                .average()  // 计算平均值
                .orElse(0);

        // 3. 获取部门总数
        long departmentCount = departmentService.count();

        // 4. 获取平均绩效分数
        Double averagePerformanceScore = performanceService.list().stream()
                .mapToDouble(Performance::getScore)  // 获取每个绩效记录的得分
                .average()  // 计算平均得分
                .orElse(0);
        // 5. 获取薪资分布数据
        List<Salary> salaries = salaryService.list();  // 获取所有薪资记录
        int[] salaryDistribution = new int[5];  // 创建一个数组用于记录薪资分布
        salaries.forEach(emp -> {  // 遍历每个薪资记录
            double salary = emp.getActualSalary();  // 获取实际薪资
            if (salary <= 5000) salaryDistribution[0]++;
            else if (salary <= 10000) salaryDistribution[1]++;
            else if (salary <= 15000) salaryDistribution[2]++;
            else if (salary <= 20000) salaryDistribution[3]++;
            else salaryDistribution[4]++;
        });
        // 6. 获取年龄分布数据
        List<Emp> employees = empService.list();  // 获取所有员工数据
        int[] ageDistribution = new int[5];  // 创建一个数组用于记录年龄段分布
        employees.forEach(emp -> {  // 遍历每个员工
            int age = emp.getAge();  // 获取员工年龄
            if (age <= 25) ageDistribution[0]++;
            else if (age <= 35) ageDistribution[1]++;
            else if (age <= 45) ageDistribution[2]++;
            else if (age <= 55) ageDistribution[3]++;
            else ageDistribution[4]++;
        });
        //7.获取部门人数分布数据
        Map<String, Long> departmentDistribution = employees.stream()   // 将部门数据转换为流
                .collect(Collectors.groupingBy(emp -> emp.getDepartmentName(), Collectors.counting()));  // 根据部门名称进行分组，计算每个部门的员工数量

        // 8. 获取学历分布数据
        Map<String, Long> educationDistribution = employees.stream()  // 获取所有员工的学历信息，并转换为流
                .collect(Collectors.groupingBy(emp -> emp.getEducation(), Collectors.counting()));  // 根据学历进行分组，计算每种学历的员工数量

        // 将结果封装到一个JSON对象中
        JSONObject result = new JSONObject();  // 创建一个JSONObject对象用于封装结果
        result.put("totalEmployees", totalEmployees);  // 添加员工总数
        result.put("averageSalary", averageSalary);  // 添加平均工资
        result.put("departmentCount", departmentCount);  // 添加部门总数
        result.put("averagePerformanceScore", averagePerformanceScore);  // 添加平均绩效分数
        result.put("SalaryDistributionData", salaryDistribution);  // 添加薪资分布数据
        result.put("departmentDistributionData", departmentDistribution.entrySet().stream()  // 将部门分布数据转换为JSON对象
                .map(entry -> new JSONObject().fluentPut("name", entry.getKey()).fluentPut("value", entry.getValue()))  // 将Map的键值对转换为JSON对象
                .collect(Collectors.toList()));  // 收集到列表中
        result.put("ageDistributionData", ageDistribution);  // 添加年龄分布数据
        result.put("educationDistributionData", educationDistribution.entrySet().stream()  // 将学历分布数据转换为JSON对象
                .map(entry -> new JSONObject().fluentPut("name", entry.getKey()).fluentPut("value", entry.getValue()))  // 将Map的键值对转换为JSON对象
                .collect(Collectors.toList()));  // 收集到列表中
        return Result.success(result);
    }
}
